// * 静态属性和静态方法，通过 static 关键字开头，这样定义的属性或方法是存在于类本身的（不在实例对象，也不再 prototype 中），只能通过类来访问。
class User {
	// 静态属性
	static publisher = 'Levi Ding'

	// 静态方法
	static func() {
		console.log(this === User)
	}
}

User.func() // true
console.log(User.publisher) // Levi Ding

// static 关键字，类似于下面这种形式，直接往类上添加方法或属性。
User.prop = '我是静态属性'

User.fn = function () {
	console.log(this === User)
}

// *****************************************************************************************************************************************************

// * 继承静态属性和静态方法（静态属性和方法是可以被集成的）
// * extends 关键字，创建了两个 [[Prototype]] 引用：
// * 1. 类（也是函数，函数也是对象）它自身的原型指向 基类 自身。
// * 2. 类的 prototype 属性的原型指向 基类 的 prototype。

// 例子：
class C {
	static prop = '我是静态属性'
	static fn() {
		console.log(this === C)
	}
}

class D extends C {}

console.log(D.prop) // 我是静态属性
D.fn() // false

// * 静态属性和方法继承详解：

// * 1. 对于静态的（派生类通过原型去父类查找）
console.log(D.__proto__ === C) // true

// * 2. 对于常规方法（D 通过 prototype 的原型去父类查找）
console.log(D.prototype.__proto__ == C.prototype) // true

// *****************************************************************************************************************************************************

// * 总结：
// * 1. 静态方法被用于实现属于整个类的功能。

// * 2. 类的原型默认等于 Function.prototype，如下例子：
// * 默认情况下: Rabbit.__proto__ === Function.prototype
// * 但如果 Rabbit extends Object ，那么 Rabbit.__proto__ === Object 这样就可以调用 Object 自身的静态属性或方法了。
